package com.longy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;

public class Main {
    final static private List<Integer> person = new ArrayList();
    final static private Map<Integer, Integer> survivorsMap = new HashMap<>();
    final static private Map<String, Integer> map = new HashMap<>();

    final static int gameTime = 1000000;

    public static void main(String[] args) {

        for (int i = 0; i < gameTime; i++) {
            //1、初始化
            init();
            for (int j = 1; j < 600; j++) {
                //2、杀人及重新组队
                killMan();
            }
            //3、记录幸存者
            record();
            //4、输出信息
            info(i);
        }

    }

    /**
     * 输出信息
     *
     * @param i 我
     */
    private static void info(int i) {
        if (gameTime - 1 == i) {
            Map<Integer, Integer> sortMap = sortMap(survivorsMap);
            System.out.println(sortMap);
            System.out.println(map);
        }
    }

    /**
     * 记录
     */
    private static void record() {
        Integer personNo = person.get(0);
        Integer surviveNum = survivorsMap.get(person.get(0));
        survivorsMap.put(personNo, Objects.isNull(surviveNum) ? 1 : ++surviveNum);
        String oddKey = "奇数幸存次数===";
        String evenKey = "偶数幸存次数===";
        if (personNo % 2 == 0) {
            map.put(evenKey, Objects.isNull(map.get(evenKey)) ? 1 : map.get(evenKey) + 1);
        } else {
            map.put(oddKey, Objects.isNull(map.get(oddKey)) ? 1 : map.get(oddKey) + 1);
        }
        //清空号码牌
        person.clear();
    }

    /**
     * 杀基数号码的人
     */
    private static void killMan() {
        Random random = new Random();
        boolean flag = true;
        int killNo = 0;
        while (flag) {
            int personNo = random.nextInt(person.size());
            //从0开始，所以取模2==0是，实际上就是基数。例如：随机到0,即队列中的第一位
            if (personNo % 2 == 0) {
                killNo = personNo;
                flag = false;
            }
        }
        //arrayList会自动往前移动,补位
        person.remove(killNo);
    }

    /**
     * 初始化600人
     */
    private static void init() {
        for (int i = 1; i <= 600; i++) {
            person.add(i);
        }
    }

    /**
     * 根据值排序
     *
     * @param map 地图
     * @return {@link Map}<{@link Integer}, {@link Integer}>
     */
    public static Map<Integer, Integer> sortMap(Map<Integer, Integer> map) {
        //利用Map的entrySet方法，转化为list进行排序
        List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(map.entrySet());
        Map.Entry<Integer, Integer> maxEntry = entryList.stream().max(Comparator.comparingInt(Map.Entry::getValue)).get();
        System.out.println("幸存最多次数的人:"+maxEntry.getKey()+"==次数："+maxEntry.getValue());

        //利用Collections的sort方法对list排序
        Collections.sort(entryList, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getKey() - o1.getKey();
            }
        });
        //遍历排序好的list，一定要放进LinkedHashMap，因为只有LinkedHashMap是根据插入顺序进行存储
        LinkedHashMap<Integer, Integer> linkedHashMap = new LinkedHashMap<Integer, Integer>();
        for (Map.Entry<Integer, Integer> e : entryList) {
            linkedHashMap.put(e.getKey(), e.getValue());
        }
        return linkedHashMap;
    }
}